package czolgisci.map;

import java.io.FileReader;
import java.util.Scanner;

import czolgisci.tiles.TileType;

/**
 * Mapa gry. Składa się z kafelków (tiles - pola tablicy) do których możemy
 * odwoływać się za pomocą współrzędnych I i J. Kafelki są przetrzymywane w
 * tablicy i pozwalają na przyspieszenie wykrywania kolizji. <br/> Współrzędne X
 * i Y oznaczją położenie obiektu z dokładnością do jednego pixela
 * 
 * @author pillow
 * @pattern Adapter - Klasa Map używa klasy MapCodeInterpreter do rozpoznawania
 *          obiektów na mapie dzięki czemu jest niezależna od konkretnej
 *          implementacji kafelków
 * @version 1.0
 * 
 */
public class Map
{
	public int width;
	public int height;
	public char map[][];
	public String backgroundPath;

	/**
	 * Konstruktor klasy
	 * 
	 * @param width
	 *            szerokość mapy (ilość pól)
	 * @param height
	 *            wysokość mapy (ilość pól)
	 * @param mapArr
	 *            dwuwymiarowa tablica reprezentująca mapę
	 */
	public Map(int mapWidth, int mapHeight, char mapArr[][], String bgPath)
	{
		width = mapWidth;
		height = mapHeight;
		map = mapArr;
		backgroundPath = bgPath;
	}

	/**
	 * Konstruktor klasy
	 * 
	 * @param filePath ścieżka do pliku z mapą
	 */
	public Map(String filePath, String bgPath)
	{
		loadFromFile(filePath);
		backgroundPath = bgPath;
	}

	/**
	 * Pobiera typ obiektu umieszonego w kafelku
	 * 
	 * @param i
	 *            współrzędna I
	 * @param j
	 *            współrzędna J
	 * @return typ obiektu w kafelku
	 */
	public TileType getTile(int i, int j)
	{
		return MapCodeInterpreter.decodeTileType(map[i][j]);
	}

	/**
	 * Ładuje mapę z pliku
	 * 
	 * @param filePath ścieżka do pliku z mapą
	 */
	public void loadFromFile(String filePath)
	{
		try
		{
			FileReader fr = new FileReader(filePath);
			int j = 0;

			Scanner sc = new Scanner(fr);
			width = sc.nextInt();
			sc.next();
			height= sc.nextInt();
			
			map = new char[height][width];

			sc.nextLine();
			
			while (sc.hasNextLine())
			{
				map[j] = sc.nextLine().toCharArray();
				j++;
			}			
		} catch (Exception e)
		{
			e.printStackTrace();
		}
	}
}
